網(wǎng)站建設中關(guān)于并發(fā)連接數的解釋
發(fā)布時(shí)間:2013-11-22 瀏覽:836打印字號:大中小
最近網(wǎng)站常常報503錯誤:“HTTP Error 503. The service is unavailable”。但刷一兩下又正常。估計很可能是超過(guò)網(wǎng)站的并發(fā)連接數了。
究竟什么是http連接?一張頁(yè)面加載過(guò)程中,又是圖片又是樣式、腳本,對于這些東西的請求,是共用一個(gè)連接還是多個(gè)連接?
網(wǎng)上有人說(shuō),為了節省連接數,應該盡量將外部CSS,js合并,或者內聯(lián);甚至圖片也合成一張,再用CSS定位。顯然,在這里,一個(gè)請求就用一個(gè)連接,請求完成連接即被關(guān)掉。
但IIS里,有選項“保持HTTP連接”,且有超時(shí)時(shí)間可供設置。如果每請求一樣東西,就開(kāi)啟一個(gè)連接,并且這個(gè)連接遲遲不死,保持激活,那么要多少連接才夠用?這里的意思,應該是一個(gè)連接可以供多次使用。
究竟哪個(gè)才對?
其實(shí)都對。
http協(xié)議無(wú)狀態(tài),無(wú)連接。無(wú)連接的含義就是限制每次連接只處理一個(gè)請求,收到應答后即斷開(kāi)。但據說(shuō)這個(gè)是http1.0。
http1.1里,提出了持久連接(persistentconnection)的概念,也就是說(shuō)同一條 HTTP連接,可以依次處理多個(gè)請求。據說(shuō)目前大多數瀏覽器都支持這個(gè)。想想也有道理,建立一個(gè)http連接,消耗的成本是很高的,類(lèi)似數據庫連接,所以我們都盡量在一個(gè)數據庫連接里完成所有的操作,正如你到超市里買(mǎi)東西,不可能去一趟只買(mǎi)一樣,不然的話(huà),買(mǎi)齊所有東西天都黑了。
不過(guò),即使有持久連接的概念,還是有點(diǎn)疑惑:同一張頁(yè)面真的只用一個(gè)連接嗎?假如有些東西特別大,比如圖片,其他元素等不及了怎么辦?會(huì )不會(huì )另外開(kāi)辟一個(gè)連接?http超時(shí)時(shí)間如果都設20分鐘,未免太浪費了吧?
另外,就算同一張頁(yè)面只用一個(gè)連接,將css、js、圖片合并,也有意義。因為數量少了,發(fā)送的請求也少了,這個(gè)對性能應該也有影響。
附錄1:
一個(gè)典型的網(wǎng)頁(yè),是由一個(gè) html 文件和內嵌的各類(lèi)元素組成的,這些元素包括頁(yè)面內的圖片,css文件,javascript 文件等等。每一個(gè)內嵌的元素在 HTTP 協(xié)議的層面上和那個(gè) html文件是沒(méi)有區別的:也就是都需要瀏覽器去服務(wù)器上抓下來(lái)。一個(gè)早期典型的瀏覽器是這樣實(shí)現的:當用戶(hù)敲入網(wǎng)址之后,瀏覽器和服務(wù)器建立連接,請求 這個(gè)html 頁(yè)面,然后邊接收服務(wù)器發(fā)送的 html頁(yè)面,邊解析,碰到內嵌元素,可以立即開(kāi)第二條連接請求。另外,如果內嵌元素很多,他可能會(huì )開(kāi)多條連接同時(shí)請求。當所有需要的元素都下載完畢之 后,瀏覽器就會(huì )將頁(yè)面畫(huà)出來(lái)。這個(gè)過(guò)程就是最早期的 HTTP/1.0 協(xié)議所設想的瀏覽器實(shí)現。
HTTP/1.0 這種多連接的運作模式是可以改進(jìn)的。建立 TCP連接的過(guò)程是這樣:客戶(hù)端給服務(wù)器發(fā)一個(gè)網(wǎng)絡(luò )包說(shuō)我要和你建立連接,服務(wù)器收到之后回一個(gè)網(wǎng)絡(luò )包說(shuō)“我愿意”,然后客戶(hù)端要再發(fā)給服務(wù)器一個(gè)網(wǎng)絡(luò )包 說(shuō)“好那咱們開(kāi)始傳數據吧”。這一來(lái)一去三個(gè)包才能建立 TCP連接。連接建立之后,瀏覽器給服務(wù)器發(fā)請求,服務(wù)器給瀏覽器回應。完事之后又要來(lái)回幾個(gè)網(wǎng)絡(luò )包關(guān)閉 TCP連接。如果頁(yè)面有很多文件長(cháng)度很短的元素,每個(gè)元素都需要單建一條連接就會(huì )導致網(wǎng)絡(luò )上大量的都是 TCP 建立連接和斷開(kāi)連接的網(wǎng)絡(luò )包。另外,TCP有一個(gè)特性叫做 slow start,其含義可以大致這樣解釋?zhuān)篢CP連接要求發(fā)送端發(fā)送一定數量的網(wǎng)絡(luò )包之后接收端就要回一個(gè)“我收到”的網(wǎng)絡(luò )包,而且網(wǎng)絡(luò )包在經(jīng)過(guò)每個(gè)路由器的 時(shí)候包頭都要被重寫(xiě),所以在網(wǎng)絡(luò )不丟包的情況下網(wǎng)絡(luò )包越大網(wǎng)絡(luò )的效率就越高。TCP 連接尋找最優(yōu)網(wǎng)絡(luò )包大小的方法是,在 TCP連接建立的初期,網(wǎng)絡(luò )包的大小是很小的,根據網(wǎng)絡(luò )狀況,兩端的程序才會(huì )逐步增大網(wǎng)絡(luò )包的大小以適應帶寬提高網(wǎng)絡(luò )傳輸的效率。所以瀏覽器給服務(wù)器發(fā)請 求,如果每發(fā)一個(gè)請求就關(guān)閉連接的話(huà),那這個(gè)連接的數據傳輸很難達到帶寬所能承載的速度。
基于這種種原 因,HTTP/1.1 很快出來(lái)了,提出了持久連接(persistentconnection)的概念,也就是說(shuō)同一條 HTTP連接,可以依次處理多個(gè)請求,同時(shí)用一定的機制保證各個(gè)請求之間的分離性。具體的操作過(guò)程是:服務(wù)器給瀏覽器發(fā)送回應之后,并不馬上關(guān)閉連接;瀏 覽器判斷上一個(gè)請求的回應已經(jīng)收完的情況下,可以在這同一個(gè)連接上發(fā)第二個(gè)請求。這種運作模式大大減少了網(wǎng)絡(luò )包,實(shí)驗也表明這種做法很有效。但是,由于服 務(wù)器上保持連接要占用一定的資源,所以一般服務(wù)器不會(huì )永久保持持久連接,而且也不推薦瀏覽器和服務(wù)器之間建立過(guò)多的持久連接。
持 久連接可以進(jìn)一步提速。這就是 pipelining了。上面可以看到,瀏覽器需要等待持久連接里上一個(gè)請求的回應完全收完才能發(fā)送后面的請求。如果和服務(wù)器的連接比較慢,往往持久連接 大部分時(shí)間都花在等待而非數據發(fā)送/接收上。pipelining的意思是,瀏覽器可以在一個(gè)持久連接里一次給服務(wù)器發(fā)送多個(gè)請求,服務(wù)器在這個(gè)連接上依 次回應這些請求。這種運作方式和瀏覽器緩存結合起來(lái)的時(shí)候會(huì )尤其有效果。比方,圖片瀏覽過(guò)后會(huì )存在瀏覽器緩存中,再次請求的時(shí)候瀏覽器會(huì )對服務(wù)器說(shuō),我這 里已經(jīng)有這個(gè)圖片的緩存了,修改時(shí)間是XXXX,如果服務(wù)器上這個(gè)圖片在這之后沒(méi)有修改過(guò),就不用重發(fā)了。這種情況下,服務(wù)器會(huì )發(fā)一個(gè)很短的 304 Not Modified 類(lèi)型的回應。如果沒(méi)有pipelining,每次這樣問(wèn)一下都要等待網(wǎng)絡(luò )上傳輸打一個(gè)來(lái)回;而如果有 pipelining,瀏覽器可以同時(shí)問(wèn)服務(wù)器我這里 4個(gè)圖片是否有修改,如果服務(wù)器對 pipelining 支持的好,它甚至可以將四個(gè)回應放到同一個(gè)網(wǎng)絡(luò )包里面傳回來(lái),這是一個(gè)大大的加速。
pipelining 最早提出的時(shí)候還有一種設想的用法是,如果服務(wù)器對 pipelining 支持的好,可以把同一個(gè) pipeline 里面的兩個(gè)請求放到兩個(gè) CPU 上去處理,這樣能進(jìn)一步加快響應速度。當然這個(gè)可能也沒(méi)什么用。
附錄2:
引言
HTTP是一個(gè)屬于應用層的面向對象的協(xié)議,由于其簡(jiǎn)捷、快速的方式,適用于分布式超媒體信息系統。它于1990年提出,經(jīng)過(guò)幾年的使用與發(fā)展, 得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規范化工作正在進(jìn)行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經(jīng)提出。
HTTP協(xié)議的主要特點(diǎn)可概括如下:
1.支持客戶(hù)/服務(wù)器模式。
2.簡(jiǎn)單快速:客戶(hù)向服務(wù)器請求服務(wù)時(shí),只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶(hù)與服務(wù)器聯(lián)系的類(lèi)型不同。由于HTTP協(xié)議簡(jiǎn)單,使得HTTP服務(wù)器的程序規模小,因而通信速度很快。
3.靈活:HTTP允許傳輸任意類(lèi)型的數據對象。正在傳輸的類(lèi)型由Content-Type加以標記。
4.無(wú)連接:無(wú)連接的含義是限制每次連接只處理一個(gè)請求。服務(wù)器處理完客戶(hù)的請求,并收到客戶(hù)的應答后,即斷開(kāi)連接。采用這種方式可以節省傳輸時(shí)間。
5.無(wú)狀態(tài):HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著(zhù)如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應答就較快。
一、HTTP協(xié)議詳解之URL篇
http(超文本傳輸協(xié)議)是一個(gè)基于請求與響應模式的、無(wú)狀態(tài)的、應用層的協(xié)議,?;赥CP的連接方式,HTTP1.1版本中給出一種持續連接的機制,絕大多數的Web開(kāi)發(fā),都是構建在HTTP協(xié)議之上的Web應用。
HTTP URL (URL是一種特殊類(lèi)型的URI,包含了用于查找某個(gè)資源的足夠的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通過(guò)HTTP協(xié)議來(lái)定位網(wǎng)絡(luò )資源;host表示合法的Internet主機域名或者IP地址;port指定一個(gè)端口號,為空則使用 缺省端口80;abs_path指定請求資源的URI;如果URL中沒(méi)有給出abs_path,那么當它作為請求URI時(shí),必須以“/”的形式給出,通常 這個(gè)工作瀏覽器自動(dòng)幫我們完成。


